/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __HW_CONFIG_H__
#define __HW_CONFIG_H__

#include <stdio.h>
#include "string.h"
#include "stm32f10x.h"
#include "uart_dma.h"
#include "math.h"
#include "sys_type.h"
#include "sdcard.h"
#include "stm32f10x_sdio.h"


#define   Pin_SD          GPIO_Pin_14              //PB14 
#define   GPIO_SD         GPIOB


#define SD_EXISTED        ((GPIO_SD->IDR & Pin_SD) == RESET)    

/*------------USART IO PORT config-------------------*/

#define COM1_Port         USART1    
#define COM1_TX           GPIO_Pin_5
#define COM1_TX_GPIO      GPIOA
#define COM1_RX           GPIO_Pin_2
#define COM1_RX_GPIO      GPIOA
#define COM1_DE           GPIO_Pin_4
#define COM1_DE_GPIO      GPIOC
#define COM1_RX_MODE()    do{ COM1_DE_GPIO->BRR = COM1_DE; COM4_DE_GPIO->BSRR = COM4_DE; COM5_DE_GPIO->BSRR = COM5_DE; }while(0)
#define COM1_TX_MODE()    do{ COM1_DE_GPIO->BSRR = COM1_DE; COM4_DE_GPIO->BRR = COM4_DE; COM5_DE_GPIO->BRR = COM5_DE; }while(0)

#define COM2_Port         USART2
#define COM2_TX           GPIO_Pin_1            // USART2 config
#define COM2_TX_GPIO      GPIOD
#define COM2_RX           GPIO_Pin_6
#define COM2_RX_GPIO      GPIOD

#define COM4_Port         UART4
#define COM4_TX           GPIO_Pin_10            // COM4 config
#define COM4_TX_GPIO      GPIOC
#define COM4_RX           GPIO_Pin_11
#define COM4_RX_GPIO      GPIOC
#define COM4_DE           GPIO_Pin_15
#define COM4_DE_GPIO      GPIOA

#define COM5_Port         UART5
#define COM5_TX           GPIO_Pin_12            // USART5 config
#define COM5_TX_GPIO      GPIOC
#define COM5_RX           GPIO_Pin_2
#define COM5_RX_GPIO      GPIOD
#define COM5_DE           GPIO_Pin_2
#define COM5_DE_GPIO      GPIOC

#if 0
#define SD_SPI                           SPI1
#define SD_SPI_CLK                       RCC_APB2Periph_SPI1
#define SD_SPI_SCK_PIN                   GPIO_Pin_5                  /* PA.05 */
#define SD_SPI_SCK_GPIO_PORT             GPIOA                       /* GPIOA */
#define SD_SPI_SCK_GPIO_CLK              RCC_APB2Periph_GPIOA
#define SD_SPI_MISO_PIN                  GPIO_Pin_6                  /* PA.06 */
#define SD_SPI_MISO_GPIO_PORT            GPIOA                       /* GPIOA */
#define SD_SPI_MISO_GPIO_CLK             RCC_APB2Periph_GPIOA
#define SD_SPI_MOSI_PIN                  GPIO_Pin_7                  /* PA.07 */
#define SD_SPI_MOSI_GPIO_PORT            GPIOA                       /* GPIOA */
#define SD_SPI_MOSI_GPIO_CLK             RCC_APB2Periph_GPIOA
#define SD_CS_PIN                        GPIO_Pin_15              /* PB.15 */
#define SD_CS_GPIO_PORT                  GPIOB                     /* GPIOB */
#define SD_CS_GPIO_CLK                   RCC_APB2Periph_GPIOB
#define SD_DETECT_PIN                    GPIO_Pin_14                 /* PE.14 */
#define SD_DETECT_GPIO_PORT              GPIOB                       /* GPIOB */
#define SD_DETECT_GPIO_CLK               RCC_APB2Periph_GPIOB
#endif

#define SD_SPI                           SPI1
#define SD_SPI_CLK                       RCC_APB2Periph_SPI1
#define SD_SPI_SCK_PIN                   GPIO_Pin_5                  /* PA.05 */
#define SD_SPI_SCK_GPIO_PORT             GPIOA                       /* GPIOA */
#define SD_SPI_SCK_GPIO_CLK              RCC_APB2Periph_GPIOA
#define SD_SPI_MISO_PIN                  GPIO_Pin_6                  /* PA.06 */
#define SD_SPI_MISO_GPIO_PORT            GPIOA                       /* GPIOA */
#define SD_SPI_MISO_GPIO_CLK             RCC_APB2Periph_GPIOA
#define SD_SPI_MOSI_PIN                  GPIO_Pin_7                  /* PA.07 */
#define SD_SPI_MOSI_GPIO_PORT            GPIOA                       /* GPIOA */
#define SD_SPI_MOSI_GPIO_CLK             RCC_APB2Periph_GPIOA
#if 0
#define SD_CS_PIN                        GPIO_Pin_11               /* PD.11 */
#define SD_CS_GPIO_PORT                  GPIOD                      /* GPIOD */
#define SD_CS_GPIO_CLK                   RCC_APB2Periph_GPIOD
#else
#define SD_CS_PIN                        GPIO_Pin_15              /* PB.15 */
#define SD_CS_GPIO_PORT                  GPIOB                     /* GPIOB */
#define SD_CS_GPIO_CLK                   RCC_APB2Periph_GPIOB
#endif   
#define SD_DETECT_PIN                    GPIO_Pin_14                 /* PE.14 */
#define SD_DETECT_GPIO_PORT              GPIOB                       /* GPIOB */
#define SD_DETECT_GPIO_CLK               RCC_APB2Periph_GPIOB
#if 0
#define SD_SPI                           SPI3
#define SD_SPI_CLK                       RCC_APB1Periph_SPI3
#define SD_SPI_SCK_PIN                   GPIO_Pin_10                 /* PC.10 */
#define SD_SPI_SCK_GPIO_PORT             GPIOC                       /* GPIOC */
#define SD_SPI_SCK_GPIO_CLK              RCC_APB2Periph_GPIOC
#define SD_SPI_MISO_PIN                  GPIO_Pin_11                 /* PC.11 */
#define SD_SPI_MISO_GPIO_PORT            GPIOC                       /* GPIOC */
#define SD_SPI_MISO_GPIO_CLK             RCC_APB2Periph_GPIOC
#define SD_SPI_MOSI_PIN                  GPIO_Pin_12                 /* PC.12 */
#define SD_SPI_MOSI_GPIO_PORT            GPIOC                       /* GPIOC */
#define SD_SPI_MOSI_GPIO_CLK             RCC_APB2Periph_GPIOC
#define SD_CS_PIN                        GPIO_Pin_4                  /* PA.04 */
#define SD_CS_GPIO_PORT                  GPIOA                       /* GPIOA */
#define SD_CS_GPIO_CLK                   RCC_APB2Periph_GPIOA
#define SD_DETECT_PIN                    GPIO_Pin_0                  /* PE.00 */
#define SD_DETECT_GPIO_PORT              GPIOE                       /* GPIOE */
#define SD_DETECT_GPIO_CLK               RCC_APB2Periph_GPIOE
#endif

#define LED_GPIO        GPIOB
#define LED_RUNNING     GPIO_Pin_0
#define LED_COMM        GPIO_Pin_1

#define LED_FLASH(led)    (((LED_GPIO->ODR & (led)) == RESET) ? (LED_GPIO->BSRR=(led)) : (LED_GPIO->BRR=(led)))
#define LED_ON(led)       (LED_GPIO->BRR=(led))
#define LED_OFF(led)      (LED_GPIO->BSRR=(led))

void System_Setup(void);
void SD_LowLevel_DeInit(void);
void SD_LowLevel_Init(void); 
void SD_SPI_SetSpeedLow(void);
void SD_SPI_SetSpeedHi(void);

#endif  /*__HW_CONFIG_H__*/

